昨天我們看到了migrate一開始會去拿到相對應的connection物件也就是DatabaseWrapper
,而拿到這個connection後具體要做什麼呢?今天就讓我們繼續往下捕捉migrate的動向!
接續昨天的位置,今天會從MigrationExecutor開始~
挖
這邊看到原本的connection又分別丟給了MigrationLoader
和MigrationRecorder
兩個class,看一下他們init時分別會做什麼事吧!
先從Loader開始
看註解,Loader會把分別在disk和database中的migration files load進來後進行操作~看來會分別和disk和databse做連接
接著看到最後一行self.build_graph()
建立圖表?來看看這是在做什麼~
哦!看來是把migrations中的disk和database的data存到MigrationGraph
中!
不過我們還是一個一個擊破!
首先是
會把我們在settings.py
中INSTALLED_APPS
的每個app中的migrations讀取進來,下面做了一些檔案的操作會把在app中的migrations裡面的py檔的Migration丟進dict存著
接著我們回到build_graph
往下
接下來是load database dataMigrationRecorder
前面好像也要看到,這邊不止new出來還call了applied_migrations
從function名字我們也可以很輕易的了解他想做什麼了~我們進去看看這個function做了什麼事吧!
再往裡看has_table()
哦!!這裡的connection是誰還記得嗎!是sqlite3中的DatabaseWrapper
看看cursor
做了什麼~
我們可以在他的父類別BaseDatabaseWrapper
找到,而with的原理需要google看文章了!提供一篇
再往裡
一樣一個一個看
看註解就可以知道會關掉有問題的連線~
往下移動
這邊的self.wrap_database_errors
又是什麼呢?
這邊有些with的相關用法~先暫時把他理解為處理過程中遇到error的地方吧~
我們在回到ensure_connection()
的下一個self.connect()
我們先把目標放在self.get_new_connection()
這個function!
這邊要回到sqlite3的DatabaseWrapper
終於是看到連接database的地方啦!!
這個就是django/python跟sqlite3溝通的地方了!有機會再看看更底層連接的C語言吧~這個DB-API相關規範也都有寫在python的文件裡面!
接著再回到_cursor()
然後今天就先停在這邊吧!明天我們再接著繼續!!
現在停在紅色那點~
稍微看一下今天的關鍵字
migrate真的是很龐大,也終於是找到django和database的橋樑啦!!不過詳細的運作邏輯還是得去看python的原始碼看看python sqlite C 這三個怎麼串接的!不過我們這次主題是django這邊就不寫在鐵人賽了~